home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / c / vbccsrc.lha / vbcc / main.c < prev    next >
C/C++ Source or Header  |  1999-03-07  |  21KB  |  572 lines

  1. /*  $VER: vbcc (main.c) V0.4    */
  2.  
  3. #include "vbc.h"
  4.  
  5. static char FILE_[]=__FILE__;
  6.  
  7. int endok=1;
  8. int line,errors;
  9.  
  10. char *multname[]={"","s"};
  11. void raus(void)
  12. /*  Beendet das Programm                                            */
  13. {
  14.     if(DEBUG) printf("raus()\n");
  15.     if(!endok) printf("unexpected end of file\n");
  16.     if(errors) printf("%d error%s found!\n",errors,multname[errors>1]);
  17.     while(nesting>=0) leave_block();
  18.     if(in[0]&&(c_flags[17]&USEDFLAG)) fclose(in[0]);
  19.     cleanup_cg(out);
  20.     if(ppout) fclose(ppout);
  21.     if(out) fclose(out);
  22.     if(ic1) fclose(ic1);
  23.     if(ic2) fclose(ic2);
  24.     if(!(c_flags[17]&USEDFLAG)) pp_free();
  25.     if(endok&&!errors) exit(EXIT_SUCCESS); else exit(EXIT_FAILURE);
  26. }
  27.  
  28. int eof;
  29.  
  30. void translation_unit(void)
  31. /*  bearbeitet translation_unit                                     */
  32. /*  hier z.Z. nur provisorisch                                      */
  33. {
  34.     while(1){
  35.         killsp();
  36.         if(c_flags[18]&USEDFLAG){
  37.             fputs(string,ppout);fputc('\n',ppout);
  38.             s=string;*s=0;
  39.         }else{
  40.             if(eof||(!isalpha((unsigned char)*s)&&*s!='_')){
  41.                 if(!eof) error(0);
  42.                 raus();
  43.             }
  44.             endok=0;
  45.             var_declaration();
  46.             endok=1;
  47.         }
  48.     }
  49. }
  50.  
  51. void dontwarn(char *p)
  52. /*  schaltet flags fuer Meldung auf DONTWARN    */
  53. {
  54.     int i;
  55.     if(*p!='=') error(4,"-dontwarn");
  56.     i=atoi(p+1);
  57.     if(i>=err_num) error(159,i);
  58.     if(i<0){
  59.         for(i=0;i<err_num;i++)
  60.             if(!(err_out[i].flags&(ANSIV|FATAL)))
  61.                 err_out[i].flags|=DONTWARN;
  62.         return;
  63.     }
  64.     if(err_out[i].flags&(ANSIV|FATAL)) error(160,i);
  65.     err_out[i].flags|=DONTWARN;
  66. }
  67. void warn(char *p)
  68. /*  schaltet Warnung fuer Meldung ein           */
  69. /*  wenn Nummer<0 sind alle Warnungen ein       */
  70. {
  71.     int i;
  72.     if(*p!='=') error(4,"-warn");
  73.     i=atoi(p+1);
  74.     if(i>=err_num) error(159,i);
  75.     if(i<0){
  76.         for(i=0;i<err_num;i++) err_out[i].flags&=~DONTWARN;
  77.         return;
  78.     }else err_out[i].flags&=~DONTWARN;
  79. }
  80.  
  81. extern char *copyright;
  82.  
  83. int main(int argc,char *argv[])
  84. {
  85.     int i,j,fname=0;
  86.     c_flags_val[9].f=dontwarn;
  87.     c_flags_val[10].f=warn;
  88.     for(i=1;i<argc;i++){
  89.         if(*argv[i]!='-'){  /*  kein Flag   */
  90.             if(fname){
  91.                 error(1);
  92.             }else fname=i;
  93.         }else{
  94.             int flag=0;
  95.             for(j=0;j<MAXCF&&flag==0;j++){
  96.                 size_t l;
  97.                 if(!c_flags_name[j]) continue;
  98.                 l=strlen(c_flags_name[j]);
  99.                 if(l>0&&!strncmp(argv[i]+1,c_flags_name[j],l)){
  100.                     flag=1;
  101.                     if((c_flags[j]&(USEDFLAG|FUNCFLAG))==USEDFLAG){error(2,argv[i]);break;}
  102.                     c_flags[j]|=USEDFLAG;
  103.                     if(c_flags[j]&STRINGFLAG){
  104.                         if(argv[i][l+1]!='='){error(3,argv[i]);}
  105.                         if(argv[i][l+2]||i>=argc-1)
  106.                             c_flags_val[j].p=&argv[i][l+2];
  107.                         else
  108.                             c_flags_val[j].p=&argv[++i][0];
  109.                     }
  110.                     if(c_flags[j]&VALFLAG){
  111.                         if(argv[i][l+1]!='='){error(4,argv[i]);}
  112.                         if(argv[i][l+2]||i>=argc-1)
  113.                             c_flags_val[j].l=atol(&argv[i][l+2]);
  114.                         else
  115.                             c_flags_val[j].l=atol(&argv[++i][0]);
  116.                     }
  117.                     if(c_flags[j]&FUNCFLAG) c_flags_val[j].f(&argv[i][l+1]);
  118.                 }
  119.             }
  120.             for(j=0;j<MAXGF&&flag==0;j++){
  121.                 size_t l;
  122.                 if(!g_flags_name[j]) continue;
  123.                 l=strlen(g_flags_name[j]);
  124.                 if(l>0&&!strncmp(argv[i]+1,g_flags_name[j],l)){
  125.                     flag=1;
  126.                     if((g_flags[j]&(USEDFLAG|FUNCFLAG))==USEDFLAG){error(2,argv[i]);break;}
  127.                     g_flags[j]|=USEDFLAG;
  128.                     if(g_flags[j]&STRINGFLAG){
  129.                         if(argv[i][l+1]!='='){error(3,argv[i]);}
  130.                         if(argv[i][l+2]||i>=argc-1)
  131.                             g_flags_val[j].p=&argv[i][l+2];
  132.                         else
  133.                             g_flags_val[j].p=&argv[++i][0];
  134.                     }
  135.                     if(g_flags[j]&VALFLAG){
  136.                         if(argv[i][l+1]!='='){error(4,argv[i]);}
  137.                         if(argv[i][l+2]||i>=argc-1)
  138.                             g_flags_val[j].l=atol(&argv[i][l+2]);
  139.                         else
  140.                             g_flags_val[j].l=atol(&argv[++i][0]);
  141.                     }
  142.                     if(g_flags[j]&FUNCFLAG) g_flags_val[j].f(&argv[i][l+1]);
  143.                 }
  144.             }
  145.             if(!flag){error(5,argv[i]);}
  146.         }
  147.     }
  148.     if(!(c_flags[6]&USEDFLAG)){
  149.       printf("%s\n",copyright);
  150.       printf("%s\n",cg_copyright);
  151.     }
  152.     if(!(c_flags[17]&USEDFLAG)) pp_init();
  153.     if(!(c_flags[8]&USEDFLAG)) c_flags_val[8].l=10; /* max. Fehlerzahl */
  154.     if(c_flags[22]&USEDFLAG) c_flags[7]|=USEDFLAG;   /*  iso=ansi */
  155.     if(c_flags[7]&USEDFLAG) error(209);
  156.     if(c_flags[0]&USEDFLAG) optflags=c_flags_val[0].l;
  157.     if(c_flags[11]&USEDFLAG) maxoptpasses=c_flags_val[11].l;
  158.     if(c_flags[12]&USEDFLAG) inline_size=c_flags_val[12].l;
  159.     if(c_flags[21]&USEDFLAG) fp_assoc=1;
  160.     if(c_flags[25]&USEDFLAG) unroll_size=c_flags_val[25].l;
  161.     if(c_flags[23]&USEDFLAG) noaliasopt=1;
  162.     if(!fname){error(6);}
  163.     inname=argv[fname];
  164.     strncpy(errfname,inname,FILENAME_MAX);    /*  das hier ist Muell - wird noch geaendert    */
  165.     if(!init_cg()) exit(EXIT_FAILURE);
  166.     if(c_flags[24]&USEDFLAG) multiple_ccs=0;
  167.     if(c_flags[17]&USEDFLAG){
  168.         in[0]=fopen(inname,"r");
  169.         if(!in[0]) {error(7,inname);}
  170.     }else{
  171.         if(!pp_include(inname)) error(7,inname);
  172.     }
  173.     if(!(c_flags[18]&USEDFLAG)&&!(c_flags[5]&USEDFLAG)){
  174.         if(c_flags[1]&USEDFLAG){
  175.             out=open_out(c_flags_val[1].p,0);
  176.         }else{
  177.             out=open_out(inname,"asm");
  178.         }
  179.         if(!out){
  180.             if(c_flags[17]&USEDFLAG){
  181.                 fclose(in[0]);
  182.             }else{
  183.                 pp_free();
  184.             }
  185.             exit(EXIT_FAILURE);
  186.         }
  187.     }
  188.     if(c_flags[2]&USEDFLAG) ic1=open_out(inname,"ic1");
  189.     if(c_flags[3]&USEDFLAG) ic2=open_out(inname,"ic2");
  190.     if(c_flags[18]&USEDFLAG) ppout=open_out(inname,"i");
  191.     if(c_flags[4]&USEDFLAG) DEBUG=c_flags_val[4].l; else DEBUG=0;
  192.     switch_count=0;break_label=0;
  193.     *string=0;s=string;line=0;
  194.     killsp();
  195.     nesting=-1;enter_block();
  196.     translation_unit();
  197. }
  198. int mcmp(const char *s1,const char *s2)
  199. /*  Einfachere strcmp-Variante.     */
  200. {
  201.     char c;
  202.     do{
  203.         c=*s1++;
  204.         if(c!=*s2++) return(1);
  205.     }while(c);
  206.     return(0);
  207. }
  208. void cpbez(char *m,int check_keyword)
  209. /*  Kopiert den naechsten Bezeichner von s nach m. Wenn check_keyord!=0 */
  210. /*  wird eine Fehlermeldung ausgegeben, falls das Ergebnis ein          */
  211. /*  reserviertes Keyword von C ist.                                     */
  212. {
  213.     char *p=m,*last=m+MAXI-1;int warned=0;
  214.     if(DEBUG&128) printf("Before cpbez:%s\n",s);
  215.     while(isalpha((unsigned char)*s)||isdigit((unsigned char)*s)||*s=='_'){
  216.         if(m<last){
  217.             *m++=*s++;
  218.         }else{
  219.             s++;
  220.             if(!warned){
  221.                 error(206,MAXI-1);
  222.                 warned=1;
  223.             }
  224.         }
  225.     }
  226.     *m=0;
  227.     if(DEBUG&128) printf("After cpbez:%s\n",s);
  228.     if(check_keyword){
  229.         char *n=p+1;
  230.         switch(*p){
  231.         case 'a': if(!mcmp(n,"uto")) error(216,p);
  232.                   return;
  233.         case 'b': if(!mcmp(n,"reak")) error(216,p);
  234.                   return;
  235.         case 'c': if(!mcmp(n,"ase")) error(216,p);
  236.                   if(!mcmp(n,"har")) error(216,p);
  237.                   if(!mcmp(n,"onst")) error(216,p);
  238.                   if(!mcmp(n,"ontinue")) error(216,p);
  239.                   return;
  240.         case 'd': if(!mcmp(n,"efault")) error(216,p);
  241.                   if(!mcmp(n,"o")) error(216,m);
  242.                   if(!mcmp(n,"ouble")) error(216,p);
  243.                   return;
  244.         case 'e': if(!mcmp(n,"lse")) error(216,p);
  245.                   if(!mcmp(n,"num")) erro